{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 起步"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-13T07:00:16.440440Z",
     "start_time": "2021-10-13T07:00:16.416546Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# Python ≥3.5 \n",
    "import sys\n",
    "assert sys.version_info >= (3, 5)\n",
    "\n",
    "# Scikit-Learn 所需版本\n",
    "import sklearn\n",
    "assert sklearn.__version__ >= \"0.20\"\n",
    "\n",
    "# 导入第三模块\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "# to make this notebook's output stable across runs\n",
    "np.random.seed(42)\n",
    "\n",
    "# To plot pretty figures\n",
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "mpl.rc('axes', labelsize=14)\n",
    "mpl.rc('xtick', labelsize=12)\n",
    "mpl.rc('ytick', labelsize=12)\n",
    "plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # 避免中文乱码\n",
    "# Where to save the figures\n",
    "PROJECT_ROOT_DIR = \".\"\n",
    "CHAPTER_ID = \"svm\"\n",
    "IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID)\n",
    "os.makedirs(IMAGES_PATH, exist_ok=True)\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n",
    "    path = os.path.join(IMAGES_PATH, fig_id + \".\" + fig_extension)\n",
    "    print(\"Saving figure\", fig_id)\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format=fig_extension, dpi=resolution)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 线性SVM分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-13T07:01:36.020926Z",
     "start_time": "2021-10-13T07:01:36.002935Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SVC(C=inf, kernel='linear')"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "from sklearn import datasets\n",
    "\n",
    "iris = datasets.load_iris()\n",
    "X = iris[\"data\"][:, (2, 3)]  # 花瓣长度, 花瓣宽度\n",
    "y = iris[\"target\"]\n",
    "\n",
    "setosa_or_versicolor = (y == 0) | (y == 1)\n",
    "X = X[setosa_or_versicolor]\n",
    "y = y[setosa_or_versicolor]\n",
    "\n",
    "# SVM Classifier model\n",
    "svm_clf = SVC(kernel=\"linear\", C=float(\"inf\"))\n",
    "svm_clf.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-13T07:01:44.524929Z",
     "start_time": "2021-10-13T07:01:44.193697Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure large_margin_classification_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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3xAdWX8szlSDBg2YMmUK4J/DQ6ZNm+Y3LdRmzJiByWSS4SHCb0mB7KPMZjPff/89Xbp04bzzzmPJkiW8/fbbQO1LLFasWOFwHXGsnYVA+/fvr7Ih7r777qN169Z8/PHHjB49muTkZC6++OIa64H79OnD4cOH2bVrV41rLl68mODgYLsF76+//krbtm158803mTBhAqGhoTRo0ICBAwfStm3bil+JVpaTk0OjRo344IMP2Lx5c8XxoUOHMm3aNN555x3mzp1LcnKy/W9wADr8zmH2T9oPJuj8YWca9vLPDhDDug1jwbULuKGDrDEXrhs+fLjfDQ/p16+fDA8RwsukzZuPCgoKIjU1FZPJRHZ2Nh9++GFFX9+SkhL2799Pz549OXr0aMX5lXXp0oWUlJQa101JSeHSSy+tcby0tJTffvuNCRMmVBybMWMG9957b5XzcnNz6dy5M/v376+4Cx0aGkq/fv1sjm8+fvw4L730ks3lDj169GD58uV2vwdLliypsQs6PT0di8XCnj17SEhIICMjgz///BOARx55BK01jRo1Ij4+nujoaF5//XW71w8kx787zo6R1l7H7ea245xrzzE4ojPXOaYznWM6Gx2G8FPlw0MGDhzI9OnTGTVqlM0NyL5m5syZrFixgjfeeIOHH36YDh06GB1SrSZOnMjChQtZvnw5GzdupGfPnkaHJITTpEB2Qmys7fUwntyRWb404aOPPuKXX35h0KBB3H333bzwwgs1lljYe331vseA3Ql1y5cvJzg4mIsuugigokVbZVpr5syZQ48ePWos0Vi2bBmnT5+ucV1bd4ABunXrVlHY2rJmzRoaNGhQ0f+53BdffMEll1yCyWSiadOm9OjRg6ioKJYtW8Zvv/1WsZlvx44dXHDBBbz88svUq+f7I5M96fSW02y9aSu6VNN8XHOajWpmdEhCGGrAgAE888wz3HbbbX5RHMNfw0Peeustxo8f79YhUZ4SFxfHnDlziI+Pd9i3XgifZKtLgb89evbsqe1JTU21+zVf9+STT+r//Oc/+tSpU1prrU+cOKEBm48OHTpUvO7rr7+2ex6go6KiqrxPTk6ObtmypZ49e3bFsWnTpmmTyVTjtR07dqz4nu7bt8/h+1R/OPr3VNn333+vd+7cqa+99lr96quvVhzPz8/Xbdq00YsXL65yvtls1l27dq3yXvXq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",
      "text/plain": [
       "<Figure size 720x194.4 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Bad models\n",
    "x0 = np.linspace(0, 5.5, 200)\n",
    "# 三个随机数组\n",
    "pred_1 = 5*x0 - 20  \n",
    "pred_2 = x0 - 1.8\n",
    "pred_3 = 0.1 * x0 + 0.5\n",
    "\n",
    "def plot_svc_decision_boundary(svm_clf, xmin, xmax):\n",
    "    w = svm_clf.coef_[0]\n",
    "    b = svm_clf.intercept_[0]\n",
    "\n",
    "    # At the decision boundary, w0*x0 + w1*x1 + b = 0\n",
    "    # => x1 = -w0/w1 * x0 - b/w1\n",
    "    x0 = np.linspace(xmin, xmax, 200)\n",
    "    decision_boundary = -w[0]/w[1] * x0 - b/w[1]\n",
    "\n",
    "    margin = 1/w[1]\n",
    "    gutter_up = decision_boundary + margin\n",
    "    gutter_down = decision_boundary - margin\n",
    "\n",
    "    svs = svm_clf.support_vectors_\n",
    "    plt.scatter(svs[:, 0], svs[:, 1], s=180, facecolors='#FFAAAA')\n",
    "    plt.plot(x0, decision_boundary, \"k-\", linewidth=2)\n",
    "    plt.plot(x0, gutter_up, \"k--\", linewidth=2)\n",
    "    plt.plot(x0, gutter_down, \"k--\", linewidth=2)\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10,2.7), sharey=True)\n",
    "\n",
    "plt.sca(axes[0])\n",
    "plt.plot(x0, pred_1, \"g--\", linewidth=2)\n",
    "plt.plot(x0, pred_2, \"m-\", linewidth=2)\n",
    "plt.plot(x0, pred_3, \"r-\", linewidth=2)\n",
    "plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\", label=\"维吉尼亚鸢尾\")\n",
    "plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\", label=\"变色鸢尾\")\n",
    "plt.xlabel(\"花瓣长度\", fontsize=14)\n",
    "plt.ylabel(\"花瓣宽度\", fontsize=14)\n",
    "plt.legend(loc=\"upper left\", fontsize=14)\n",
    "plt.axis([0, 5.5, 0, 2])\n",
    "\n",
    "plt.sca(axes[1])\n",
    "plot_svc_decision_boundary(svm_clf, 0, 5.5)\n",
    "plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\")\n",
    "plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\")\n",
    "plt.xlabel(\"花瓣长度\", fontsize=14)\n",
    "plt.axis([0, 5.5, 0, 2])\n",
    "\n",
    "save_fig(\"large_margin_classification_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.18"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
